/*
 * Copyright 2013 University of Padua, Italy
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package it.dei.unipd.healthservice.database;

import it.dei.unipd.healthservice.resource.Deposito;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * Rappresenta le giacenze di una certa materia prima nel deposito di una fabbrica
 * 
 * @author Valentini
 * @version 1.00
 */
public class DepositoDatabase {

	/**
	 * Query di inserimento nuovo deposito nel database
	 */
	private static final String INSERT_STATEMENT = "INSERT INTO deposito "+
            			"(qta, idmateriaprima, login) "+
            			" VALUES (?, ?, ?);";

	/**
	 * Istruzione di aggiornamento per il database.
	 */
	private static final String UPDATE_STATEMENT = "UPDATE deposito SET qta=? " +
						" WHERE idmateriaprima=? AND login=?;";
 
	/**
	 * Istruzione di eliminazione per il database.
	 */
	private static final String DELETE_STATEMENT = " DELETE FROM deposito " +
						" WHERE idmateriaprima=? AND login=?;";
	
	/**
	 * Istruzione di eliminazione per il database in base alla sola fabbrica
	 */
	private static final String DELETE_STATEMENT_BY_LOGIN = " DELETE FROM deposito " +
			" WHERE login=?;";
	
	/**
	 * Istruzione di eliminazione per il database in base alla sola materia prima
	 */
	private static final String DELETE_STATEMENT_BY_MATERIA = " DELETE FROM deposito " +
			" WHERE idmateriaprima=?;";
		
	/**
	 * Connessione al database
	 */
	private final Connection con;

	private final Deposito deposito;
	/**
	 * Crea un nuovo elemento deposito nel database
	 * 
	 * @param con
	 *            connessione al database.
	 * @param deposito
	 * 			  l'elemento da inserire o modificare
	 */			
	public DepositoDatabase(Connection con, Deposito deposito) {
		this.con = con;
		this.deposito = deposito;
	}


	/**
	 * Crea un nuovo elemento nel database
	 * 
	 * @throws SQLException
	 *             in caso di problemi nell'accesso al database.
	 */
	public void createDeposito() throws SQLException {

		PreparedStatement pstmt = null;

		try {
			pstmt = con.prepareStatement(INSERT_STATEMENT);
			pstmt.setInt(1, deposito.getQta());
			pstmt.setInt(2, deposito.getIdMateriaPrima());
			pstmt.setString(3, deposito.getLogin());
						
			pstmt.execute();

		} finally {
			if (pstmt != null) {
				pstmt.close();
			}

			con.close();
		}

	}//end createdeposito 
	
	/**
	 * Aggiorna la quantità di un elemento nel database
	 * 
	 * @throws SQLException
	 *             in caso di problemi nell'accesso al database.
	 */
	public void updateDeposito() throws SQLException {

		PreparedStatement pstmt = null;

		try {
			pstmt = con.prepareStatement(UPDATE_STATEMENT);
			pstmt.setInt(1, deposito.getQta());
			pstmt.setInt(2, deposito.getIdMateriaPrima());
			pstmt.setString(3, deposito.getLogin());
			
			pstmt.execute();

		} finally {
			if (pstmt != null) {
				pstmt.close();
			}

			con.close();
		}

	}//end updatedeposito
	
	/**
	 * Cancella un elemento dal database
	 * 
	 * @throws SQLException
	 *             in caso di problemi nell'accesso al database.
	 */
	public void deletedeposito() throws SQLException {

		PreparedStatement pstmt = null;

		try {
			pstmt = con.prepareStatement(DELETE_STATEMENT);
			pstmt.setInt(1, deposito.getIdMateriaPrima());
			pstmt.setString(2, deposito.getLogin());
			
			pstmt.execute();

		} finally {
			if (pstmt != null) {
				pstmt.close();
			}

			con.close();
		}

	}//end deletedeposito
	
	/**
	 * Cancella tutti gli elementi dal database di una certa fabbrica
	 * 
	 * @throws SQLException
	 *             in caso di problemi nell'accesso al database.
	 */
	public void deleteDepositoByLogin() throws SQLException {

		PreparedStatement pstmt = null;

		try {
			pstmt = con.prepareStatement(DELETE_STATEMENT_BY_LOGIN);
			pstmt.setString(1, deposito.getLogin());
			
			pstmt.execute();

		} finally {
			if (pstmt != null) {
				pstmt.close();
			}

			con.close();
		}
	}//end deletedeposito
	
	/**
	 * Cancella tutti gli elemento dal database di una materia prima
	 * 
	 * @throws SQLException
	 *             in caso di problemi nell'accesso al database.
	 */
	public void deleteDepositoByMateriaPrima() throws SQLException {

		PreparedStatement pstmt = null;

		try {
			pstmt = con.prepareStatement(DELETE_STATEMENT_BY_MATERIA);
			pstmt.setInt(1, deposito.getIdMateriaPrima());
			
			pstmt.execute();

		} finally {
			if (pstmt != null) {
				pstmt.close();
			}

			con.close();
		}
	}//end deletedeposito
}
